
package repaso;

import java.util.LinkedList;
import java.util.Scanner;

public class AlgoritmoCriptografico {
    
    //DEVUELVE UNA LISTA CON EL ABECEDARIO DE LA A-Z EN MAYUSCULAS
    public LinkedList generarAbecedario() {
        LinkedList abecedario = new LinkedList();
      //  char letra;
        int letraCodigo;
        //SE CREA UN CICLO PARA OBTENER EL VALOR DEL CODIGO DEL CARACTER Y CONVERTIRLO A LETRA
        for (int i = 0; i < 26; i++) {
            //letra = (char) ('A' + i);
            //abecedario.add(letra);
            letraCodigo = 'A' + i;
            abecedario.add(letraCodigo);
        }
        
        return abecedario;
    }

    //DEVUELVE UNA LISTA CON EL ABECEDARIO DE LA Z-A EN MAYUSCULAS
    //QUE SERÁN UTILIZADOS COMO LAS EQUIVALENTES
    public LinkedList generarEquivalencia() {
        LinkedList equivalencias = new LinkedList();
        char letra;
        int letraCodigo;
        for (int i = 7; i <= 33; i++) {
            //letra = (char) ('z' - i);
            //equivalencias.add(letra);
            letraCodigo = 'a' - i;
            equivalencias.add(letraCodigo);
        }
        return equivalencias;
    }
    //RECIBO LAS 2 LISTAS ANTERIORMENTE CREADAS Y SE GENERA AUTOMATICAMENTE SU EQUIVALENTE
    public LinkedList<Letra> generarCriptograma(LinkedList abecedario, LinkedList equivalencia) {
        
        //SE CREA UNA LISTA COMPUESTA DE [A:Z] letra = equivalente
        LinkedList<Letra> criptograma = new LinkedList<Letra>();
        char a;
        char b;
        
        //CICLO AUTOMATICO
        for (int i = 0; i < abecedario.size(); i++) {
            a = (char) Integer.parseInt(abecedario.get(i).toString());
            b = (char) Integer.parseInt(equivalencia.get(i).toString());
            Letra l = new Letra(a, b);
            criptograma.add(l);
        }
        return criptograma;
    }

    //DADO UN CARACTER ME BUSCA SU EQUIVALENCIA EN UNA LISTA
    // SI NO LO ENCUENTRA DEVUELVE #
    public char buscarEquivalencia(char caracter, LinkedList<Letra> lista) {

        for (Letra object : lista) {
            if (caracter == (object.getLetra())) {
                return object.getEquivalencia();
            }
        }
        return '#';
    }
    //DADO UN CARACTER DE EQUIVALENCIA ME DEVUELVE LA LETRA EN UNA LISTA
    // SI NO LO ENCUENTRA DEVUELVE #
    public char buscarLetra(char caracter, LinkedList<Letra> lista) {

        for (Letra object : lista) {
            if (caracter == object.getEquivalencia()) {
                return (object.getLetra());
            }
        }
        return '#';
    }
    public static void main(String[] args) {
      
        AlgoritmoCriptografico ac = new AlgoritmoCriptografico();
        //SE GENERA LAS EQUIVALENCIAS
        LinkedList<Letra> abecedario = ac.generarCriptograma(ac.generarAbecedario(), ac.generarEquivalencia());
        Scanner scanner = new Scanner(System.in);
        String palabra;

        System.out.println("Ingrese 1 para Encriptar, 2 para Desencriptar: ");
        //SE RECEPTA LA PALABRA A ENCRIPTAR
        if (scanner.nextInt() == 1) {
            System.out.println("INGRESE UNA PALABRA PARA ENCRIPTAR:");
            palabra = scanner.next();
            //VARIABLE PARA ALMACENAR EL RESULTADO DE LOS CARACERES ENCONTRADOS
            String resultado = "";
            //CICLO PARA RECORRER LA PALABRA INGRESADA CARACTER POR CARACTER
            for (int i = 0; i < palabra.length(); i++) {
                resultado = resultado + ac.buscarEquivalencia(palabra.charAt(i), abecedario);
            }

            System.out.println("LA FRASE ENCRIPTADA ES: " + resultado);
        } else {
            System.out.println("INGRESE UNA PALABRA PARA DESENCRIPTAR:");
            palabra = scanner.next();
            String resultado = "";
            for (int i = 0; i < palabra.length(); i++) {
                resultado = resultado + ac.buscarLetra(palabra.charAt(i), abecedario);
            }
            System.out.println("LA FRASE DESENCRIPTADA ES: " + resultado);
        }

       //SE MUESTRA LAS EQUIVALENCIAS PARA VERIFICAR
        System.out.println("");
        System.out.println("");
        System.out.println("#############################");
        System.out.println("#############################");
        System.out.println("ESTAS SON LAS EQUIVALENCIAS DE ENCRIPTAMIENTO");
        System.out.println(ac.generarCriptograma(ac.generarAbecedario(), ac.generarEquivalencia()));
        System.out.println("#############################");
        System.out.println("#############################");
    }
}